package com.hdw.med.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hdw.common.vo.PaginationVO;
import com.hdw.med.api.MdMedPubfldService;
import com.hdw.med.api.MdMedTbService;
import com.hdw.med.bean.model.MdMedTb;
import com.hdw.med.bean.model.MdMedTbFld;
import com.hdw.med.bean.vo.MdMedTbVO;
import com.hdw.med.mapper.MdMedTbFldMapper;
import com.hdw.med.mapper.MdMedTbMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * mdMedTb服务实现类
 * Created by hozeData on 2021/06/17.
 */
@Service
@Transactional
public class MdMedTbServiceImpl implements MdMedTbService {

    private static final Logger LOGGER = LoggerFactory.getLogger(MdMedTbServiceImpl.class);


    @Autowired
    private MdMedTbMapper mdMedTbMapper;
    @Autowired
    private MdMedTbFldMapper mdMedTbFldMapper;
    @Autowired
    private MdMedPubfldService mdMedPubfldService;

    @Override
    public int insert(MdMedTb mdMedTb) {
        mdMedTb.setDtSysCre(new Date());
        return mdMedTbMapper.insert(mdMedTb);
    }

    @Override
    public int insertSelective(MdMedTb mdMedTb) {
        mdMedTb.setDtSysCre(new Date());
        return mdMedTbMapper.insertSelective(mdMedTb);
    }

    @Override
    public int deleteById(Long idMedTb) {
        return mdMedTbMapper.deleteByPrimaryKey(idMedTb);
    }

    @Override
    public int updateByIdSelective(MdMedTb mdMedTb) {
        mdMedTb.setDtSysModi(new Date());
        return mdMedTbMapper.updateByPrimaryKeySelective(mdMedTb);
    }

    @Override
    public int updateById(MdMedTb mdMedTb) {
        mdMedTb.setDtSysModi(new Date());
        return mdMedTbMapper.updateByPrimaryKey(mdMedTb);
    }

    @Override
    public MdMedTb getById(Long idMedTb) {
        return mdMedTbMapper.selectByPrimaryKey(idMedTb);
    }

    @Override
    public List<MdMedTb> findByModel(MdMedTb mdMedTb) {
        return mdMedTbMapper.findByModel(mdMedTb);
    }

    @Override
    public PaginationVO<MdMedTb> findPageByModel(MdMedTb mdMedTb, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum == null ? 1 : pageNum, pageSize == null ? 10 : pageSize);
        List<MdMedTb> quesList = mdMedTbMapper.findByModel(mdMedTb);
        PageInfo<MdMedTb> pageInfo = new PageInfo<>(quesList);
        PaginationVO<MdMedTb> paginationVo = new PaginationVO(pageInfo.getTotal(), pageInfo.getList());
        return paginationVo;
    }

    @Override
    public PaginationVO<MdMedTb> findPageByLike(String filter, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum == null ? 1 : pageNum, pageSize == null ? 10 : pageSize);
        List<MdMedTb> quesList = mdMedTbMapper.findByLike(filter);
        PageInfo<MdMedTb> pageInfo = new PageInfo<>(quesList);
        PaginationVO<MdMedTb> paginationVo = new PaginationVO(pageInfo.getTotal(), pageInfo.getList());
        return paginationVo;
    }

    @Override
    public MdMedTb getByCd(String cdTb) {
        MdMedTb tbModel = new MdMedTb();
        tbModel.setCd(cdTb);
        List<MdMedTb> list = this.findByModel(tbModel);
        if(list.size()>0) {
            return list.get(0);
        }
        return null;
    }

    @Override
    public List<MdMedTbFld> findFldByCd(String tableName,String dims) {
        MdMedTb mdMedTb = this.getByCd(tableName);
        MdMedTbFld tbFld = new MdMedTbFld();
        tbFld.setIdTb(mdMedTb.getIdTb());
        List<MdMedTbFld> tbFldList = mdMedTbFldMapper.findByModel(tbFld);
        Map<String,MdMedTbFld> fldMap = new HashMap<>();
        MdMedTbFld valueFld=null;
        List<MdMedTbFld> useFldList = new ArrayList<>();
        for(MdMedTbFld fld:tbFldList) {
            fldMap.put(fld.getIdPubfld(),fld);
            if(fld.getIdPubfld().startsWith("value_")) {
                useFldList.add(fld);
            }
        }
        if(useFldList.size()==0) return null;
        String dimFlds="",naFld,fldName;
        for(String str:dims.split(",")) {
            if((tbFld=fldMap.get(str))!=null) {
                useFldList.add(tbFld);
            }
            if(str.startsWith("id_dim_")) {
                naFld = str.replace("id_dim_","na_dim_");
                if((tbFld=fldMap.get(naFld))!=null)  {
                    useFldList.add(tbFld);
                }
            }
        }
        return useFldList;
    }

}
